package org.kgduyjj.toolkit.beans;

import java.io.Serializable;
import java.util.Optional;

import org.kgduyjj.toolkit.enumtype.ResultCode;
import org.kgduyjj.toolkit.util.StringUtils;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;

/**
 * 封装统一请求响应对象
 * 
 * @author Kgduyjj
 * @since 1.0.0
 */
@Getter
@ToString
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class JsonResult implements Serializable {
    /** */
    private static final long serialVersionUID = 1L;

    /** 状态码 */
    protected String code;
    /** 是否成功 */
    protected boolean success;
    /** 返回消息文本 */
    protected String message;
    /** 数据结果 */
    protected Object data;

    protected static JsonResult self;

    protected JsonResult(String code, String message, Object data) {
        super();
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * 构建一个返回值对象
     * 
     * @param rcode
     * @param data
     * @return
     */
    protected static JsonResult of(ResultCode rcode) {
        return new JsonResult(Optional.ofNullable(rcode).orElse(ResultCode.ERROR).getCode(),
                Optional.ofNullable(rcode).orElse(ResultCode.ERROR).getMessage(), null);
    }

    /**
     * 填充消息
     * 
     * @param message
     * @return
     */
    protected JsonResult message(String message) {
        if (StringUtils.notBlank(message)) {
            this.message = message;
        }
        return this;
    }

    /**
     * 填充数据结果
     * 
     * @param data
     * @return
     */
    public JsonResult data(Object data) {
        this.data = data;
        return this;
    }

    /**
     * 默认成功内容
     * 
     * @return
     */
    public static JsonResult success() {
        return JsonResult.of(ResultCode.SUCCESS);
    }

    /**
     * 成功
     * 
     * @param message
     * @return
     */
    public static JsonResult success(String message) {
        return success().message(message);
    }

    /**
     * 成功
     * 
     * @param message
     * @param data
     * @return
     */
    public static JsonResult success(String message, Object data) {
        return success().message(message).data(data);
    }

    /**
     * 失败
     * 
     * @return
     */
    public static JsonResult failure() {
        return JsonResult.of(ResultCode.FAILURE);
    }

    /**
     * 失败
     * 
     * @param message
     * @return
     */
    public static JsonResult failure(String message) {
        return failure().message(message);
    }

    /**
     * 失败
     * 
     * @param message
     * @return
     */
    public static JsonResult failure(String message, Object data) {
        return failure().message(message).data(data);
    }

    /**
     * 默认错误返回值
     * 
     * @return
     */
    public static JsonResult error() {
        return JsonResult.of(ResultCode.ERROR);
    }

    /**
     * 
     * @param message
     * @return
     */
    public static JsonResult error(String message) {
        return error().message(message);
    }

    /**
     * 自定义的错误返回值
     * <p>
     * 提供可编辑错误代码的方式
     * 
     * @param failureCode
     * @param message
     * @param data
     * @return
     */
    public static JsonResult customError(String errorCode, String message, Object data) {
        return new JsonResult(errorCode, message, data);
    }

    /**
     * 失败
     * <p>
     * 提供可编辑错误代码的方式
     * 
     * @param failureCode
     * @param message
     * @return
     */
    public static JsonResult customError(String failureCode, String message) {
        return customError(failureCode, message, null);
    }

}
